import defaultAxios from 'axios'
import { cleanObject, sleep } from '@/utils/tool'
import { useAuthStore } from '@/stores/auth'
import adapter from './adapter'

const axios = defaultAxios.create({
	timeout: 30000,
	baseURL: import.meta.env.VITE_API_URL
})
// 添加小程序适配器
axios.defaults.adapter = adapter

// 此方法用于保持get和post统一，也是为了适配小程序端
axios.tempGet = axios.get
axios.get = (url, params, config) => {
	params = params || {}
	return axios.tempGet(url, { params, ...config })
}

// const whiteList = [] // 不需要登录的接口地址
axios.interceptors.request.use(
	config => {
		const { token } = useAuthStore()
		config.headers.token = token
		if (config.method === 'get') {
			config.params = cleanObject(config.params)
		}
		return config
	},
	error => {
		return Promise.reject(error)
	}
)

// 添加响应拦截器
axios.interceptors.response.use(
	async res => {
		// 特殊处理的api请求地址，例如文件下载
		const excludeApi = []
		if (excludeApi.includes(res.config.url)) {
			return res.data
		}
		if (Object.prototype.toString.call(res.data) !== '[object Object]') {
			uni.showToast({ icon: 'none', title: '返回数据异常' })
			return Promise.reject(new Error(res.data))
		} else if (res.data.code === 200) {
			if (res.config.method === 'post') {
				uni.showToast({ type: 'success', title: res.data.message || '操作成功' })
			}
			return res.data.data
		} else if (res.data.code === 100000) {
			// 登录失效处理
			uni.showToast({ icon: 'none', title: '登录失效，请重新登录' })
			await sleep(1500)
			const { toLoginPage } = useAuthStore()
			toLoginPage()
			return Promise.reject(res.data)
		} else {
			uni.showToast({ icon: 'none', title: res.data.message || '出现异常' })
			return Promise.reject(new Error(res.data.message))
		}
	},
	error => {
		console.log(error)
		return Promise.reject(error)
	}
)

export default axios
